#ifndef ITERADORAVL_CPP
#define ITERADORAVL_CPP

#include "IteradorAVL.h"

template <class T>
IteradorAVL<T>::IteradorAVL(Puntero<NodoAVL<T>> raiz, nat largo)
{
	this->raiz = raiz;
	this->pila = Array<Puntero<NodoAVL<T>>>(largo);
}


template <class T>
void IteradorAVL<T>::Reiniciar()
{
	for (nat i = 0; i < this->pila.ObtenerLargo(); i++)
		this->pila[i] = NULL;

	this->tope = 0;
	AgregarCaminoAlMenor(this->raiz);
}

template <class T>	
bool IteradorAVL<T>::HayElemento() const
{
	return this->tope != 0;
}

template <class T>
const T& IteradorAVL<T>::ElementoActual() const
{
	assert(HayElemento());
	return this->pila[tope-1]->dato;
}

template <class T>
void IteradorAVL<T>::Avanzar()
{
	assert(HayElemento());
	this->tope--;
	Puntero<NodoAVL<T>> actual = this->pila[this->tope];
	this->pila[this->tope] = NULL;
	AgregarCaminoAlMenor(actual->der);
}

template <class T>
void IteradorAVL<T>::AgregarCaminoAlMenor(Puntero<NodoAVL<T>> nodo)
{
	while (nodo != NULL)
	{
		this->pila[this->tope] = nodo;
		this->tope++;
		nodo = nodo->izq;
	}
}

#endif